%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import scipy
import scipy.stats
import random
import math
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.utils.visualize_util import plot
from tabulate import tabulate
from scipy import ndimage
def FFN(inputDim, outputDim):
ffn = Sequential()
ffn.add(Dense(1024, input_dim=inputDim, init='uniform', activation='tanh'))
ffn.add(Dense(1024, input_dim=1024, init='uniform', activation='tanh'))
ffn.add(Dense(outputDim, input_dim=1024, init='uniform'))
ffn.add(Activation('sigmoid'))
return ffn
def downSample(flatPicture,factor):
newImage = np.zeros(len(flatPicture)/factor)
i = 0;
for iPixel in range(len(flatPicture)):
if (iPixel%factor==0) & (i<len(newImage)):
newImage[i] = flatPicture[iPixel]
i+=1
return newImage
def TrainNetwork(compiledNetwork, trainX, trainY, epochs):
for iEpoch in range(epochs):
compiledNetwork.train_on_batch(trainX, trainY)
if iEpoch%100==0:
print iEpoch
return compiledNetwork
def TestNetwork(trainedNetwork, testX, outputDim):
numPics = testX.shape[0];
out = np.zeros((numPics,outputDim))
for iPic in range(numPics):
out[iPic,:] = trainedNetwork.predict(testX[iPic,:].T);
print out[iPic]
return out
originalGlaucomaTrain = [None]*10
trainX = np.zeros((20,8185))
for i in range(10):
if i<9:
iPic = '0' + str(i+1);
else:
iPic = '' + str(i+1);
face = ndimage.imread('/Users/kaftand/Downloads/glaucoma/' + iPic +'_g.JPG',flatten=True)
print '/Users/kaftand/Downloads/glaucoma/' + iPic +'_g.JPG'
originalGlaucomaTrain[i] = face;
face = face.flatten()
trainX[i,:] = downSample(face,1000)/256.0
originalHealthyTrain = [None]*10
for i in range(10):
if i<9:
iPic = '0' + str(i+1);
else:
iPic = '' + str(i+1);
face = ndimage.imread('/Users/kaftand/Downloads/healthy/' + iPic +'_h.JPG',flatten=True)
print '/Users/kaftand/Downloads/healthy/' + iPic +'_h.JPG'
originalHealthyTrain[i] = face;
face = face.flatten()
trainX[i+10,:] = downSample(face,1000)/256.0
trainY = np.zeros((20,1))
for i in range(10):
trainY[i] =1;
net = FFN(trainX.shape[1],1)
net.compile(loss='binary_crossentropy', optimizer="SGD");
trainedNet = TrainNetwork(net, trainX, trainY, 2000)
testX = np.zeros((10,8185))
originalGlaucomaTest = [None]*5
originalHealthyTest = [None]*5
for i in range(5):
if i<9:
iPic = '' + str(i+11);
else:
iPic = '' + str(i+11);
face = ndimage.imread('/Users/kaftand/Downloads/glaucoma/' + iPic +'_g.JPG',flatten=True)
print '/Users/kaftand/Downloads/glaucoma/' + iPic +'_g.JPG'
originalGlaucomaTest[i] = face
face = face.flatten()
testX[i,:] = downSample(face,1000)/256.0
for i in range(5):
if i<9:
iPic = '' + str(i+11);
else:
iPic = '' + str(i+11);
face = ndimage.imread('/Users/kaftand/Downloads/healthy/' + iPic +'_h.JPG',flatten=True)
originalHealthyTest[i] = face;
face = face.flatten()
testX[i+5,:] = downSample(face,1000)/256.0
print '/Users/kaftand/Downloads/healthy/' + iPic +'_h.JPG'
for iPic in range(10):
f, axarr = plt.subplots(1, 2)
axarr[0].imshow(originalGlaucomaTrain[iPic],cmap='Greys_r')
axarr[0].set_title('Glaucoma Train')
axarr[0].get_xaxis().set_visible(False)
axarr[0].get_yaxis().set_visible(False)
axarr[1].imshow(originalHealthyTrain[iPic],cmap='Greys_r')
axarr[1].set_title('Healthy Train')
axarr[1].get_xaxis().set_visible(False)
axarr[1].get_yaxis().set_visible(False)
out = trainedNet.predict(testX)
correctTestY = [True,True,True,True,True,False,False,False,False,False]
for iPic in range(5):
f, axarr = plt.subplots(1, 2)
axarr[0].imshow(originalGlaucomaTest[iPic],cmap='Greys_r')
axarr[0].set_title('Glaucoma Test ID ' + str(out[iPic]>.5))
axarr[0].get_xaxis().set_visible(False)
axarr[0].get_yaxis().set_visible(False)
axarr[1].imshow(originalHealthyTest[iPic],cmap='Greys_r')
axarr[1].set_title('Healthy Test ID ' + str(out[iPic+5]>.5))
axarr[1].get_xaxis().set_visible(False)
axarr[1].get_yaxis().set_visible(False)
def identification(pred, act):
TP=0;
TN=0;
FP=0;
FN=0;
for i in range(len(act)):
if act[i]:
if pred[i]:
TP+=1.0;
else:
FN+=1.0;
else:
if pred[i]:
FP+=1.0;
else:
TN+=1.0;
return TP,TN,FP,FN
def sensitivity(TP, FP):
return TP/(TP+FN)
def specificity(TN, FP):
return TN/(TN+FP)
def accuracy(TP, TN, FP, FN):
return (TN + TP)/(TP + TN + FP + FN)
idTable = np.asarray([range(10),correctTestY, (out>.5).flatten()]).T.tolist()
print tabulate(idTable, headers = ['Picture #','Glaucoma Actual', 'Glaucoma Predicted'])
TP,TN,FP,FN = identification((out>.5).flatten(), correctTestY)
sens = sensitivity(TP, FP)
spec = specificity(TN,FP)
acc = accuracy(TP,TN,FP,FN)
specTable = {"Sensitivity": [sens],"Specificity": [spec], "Accuracy" : [acc]}
print ''
print tabulate(specTable,headers = 'keys')